package src;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class PreviewPanel extends JPanel {
    private JTextArea previewTextArea; // 用于显示文本文件内容的文本区域
    private JLabel previewLabel; // 用于显示图像文件的标签
    private JScrollPane previewScrollPane; // 包含文本区域或标签的滚动面板
    private File currentDirectory; // 当前目录

    /**
     * 构造函数，初始化预览面板并添加属性更改监听器
     *
     * @param fileListPanel 文件列表面板，用于获取选中的文件
     */
    public PreviewPanel(FileListPanel fileListPanel) {
        setLayout(new BorderLayout()); // 设置布局管理器为BorderLayout
        previewTextArea = new JTextArea(); // 初始化文本区域
        previewTextArea.setEditable(false); // 文本区域不可编辑
        previewLabel = new JLabel(); // 初始化标签
        previewScrollPane = new JScrollPane(previewTextArea); // 初始化滚动面板并包含文本区域
        add(previewScrollPane, BorderLayout.CENTER); // 将滚动面板添加到中心位置

        // 添加属性更改监听器以响应文件列表面板中选中文件的变化
        fileListPanel.addPropertyChangeListener("selectedFile", evt -> {
            File selectedFile = (File) evt.getNewValue();
            if (selectedFile != null) {
                currentDirectory = selectedFile.getParentFile(); // 更新当前目录
                previewFile(selectedFile); // 预览选中的文件
            }
        });
    }

    /**
     * 获取当前目录
     *
     * @return 当前目录
     */
    public File getCurrentDirectory() {
        return currentDirectory;
    }

    /**
     * 根据文件类型预览文件内容
     *
     * @param file 要预览的文件
     */
    private void previewFile(File file) {
        System.out.println("Previewing file: " + file.getAbsolutePath()); // 打印文件路径
        if (!file.exists() || !file.canRead()) {
            // 显示错误消息对话框如果文件不存在或无法读取
            return;
        }

        String fileName = file.getName().toLowerCase(); // 获取文件名并转换为小写
        if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") || fileName.endsWith(".png") || fileName.endsWith(".gif")) {
            try {
                // 读取图像文件并将其设置为标签的图标
                BufferedImage image = ImageIO.read(file);
                ImageIcon icon = new ImageIcon(image);
                previewLabel.setIcon(icon);
                previewScrollPane.setViewportView(previewLabel); // 将标签添加到滚动面板
            } catch (IOException e) {
                // 显示错误消息对话框并打印堆栈跟踪
                e.printStackTrace();
            }
        } else {
            StringBuilder contentBuilder = new StringBuilder(); // 用于存储文件内容
            try {
                // 读取文本文件的所有行并将它们追加到StringBuilder中
                List<String> lines = Files.readAllLines(Paths.get(file.getAbsolutePath()));
                for (String line : lines) {
                    contentBuilder.append(line).append("\n");
                }
            } catch (IOException e) {
                // 显示错误消息对话框并打印堆栈跟踪
                e.printStackTrace();
                return;
            }

            if (contentBuilder.length() == 0) {
                // 显示信息消息对话框如果文件为空
                return;
            }

            // 设置文本区域的内容并将其添加到滚动面板
            previewTextArea.setText(contentBuilder.toString());
            previewScrollPane.setViewportView(previewTextArea);
        }
    }
}